package com.bicon.botu.core.base.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.json.JSONTokener;

import java.lang.reflect.Type;

/**
 * <p>
 * <p>
 * json 解析转换工具类
 * <p>
 * </p>
 *
 * @author tao.zeng.
 * @since 2017/12/23.
 */
public final class JsonParse {

    /**
     * 对象装换成json字符串
     *
     * @param data    需要序列化的数据
     * @param feature 可选参数 用于指定序列化模式
     *                <p>
     *                QuoteFieldNames———-输出key时是否使用双引号,默认为true
     *                WriteMapNullValue——–是否输出值为null的字段,默认为false
     *                WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
     *                WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
     *                WriteNullStringAsEmpty—字符类型字段如果为null,输出为""而非null
     *                WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
     *                </p>
     * @return
     */
    public static String toJson(Object data, SerializerFeature... feature) {
        return JSON.toJSONString(data, feature);
    }

    /**
     * 判断是否是 JsonObject
     *
     * @param json
     * @return
     */
    public static boolean isJsonObject(String json) {
        Object o = null;
        try {
            o = new JSONTokener(json).nextValue();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return (o != null && o instanceof JSONObject);
    }

    /**
     * 判断是否是 JsonArray
     *
     * @param json
     * @return
     */
    public static boolean isJsonArray(String json) {
        return !isJsonObject(json);
    }


    /**
     * json 转对象
     *
     * @param json
     * @param clz
     * @param <T>
     * @return
     */
    public static <T> T parse(String json, Class<T> clz) {
        return JSON.parseObject(json, clz);
    }

    /**
     * json 转对象
     *
     * @param json
     * @param type
     * @param <T>
     * @return
     */
    public static <T> T parse(String json, Type type) {
        return JSON.parseObject(json, type);
    }
}


